home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / windows / wdj1096.zip / OTALA.ZIP / EWV.CPP < prev    next >
C/C++ Source or Header  |  1996-07-03  |  3KB  |  98 lines

  1. #include <windows.h>
  2. #include "ewv.h"
  3.  
  4. #define MAKEWORD(lo, hi)        ((WORD)(hi) * 256 +\
  5.                                  (WORD)(lo))
  6. #define BAD_PTR(p, cb)          (IsBadReadPtr((p), (cb)) ||\
  7.                                  IsBadWritePtr((p), (cb)))
  8.  
  9. // undocumented function - KERNEL.133
  10. extern "C" HMODULE WINAPI GetExePtr(HANDLE hModOrInst);
  11.  
  12. BOOL IsWin95()
  13. {
  14.     return (GetProcAddress(GetModuleHandle("KERNEL"),
  15.       "GetVersionEx") != NULL);
  16. }
  17.  
  18. BOOL GetModuleExpWinVer(HMODULE hModule, LPWORD pwVer)
  19. {
  20.     hModule = GetExePtr(hModule);
  21.     LPBYTE pMDB = LPBYTE(MAKELP(hModule, 0));
  22.     if (!BAD_PTR(pMDB, 0x40) &&
  23.         pMDB[0x00] == 'N' && pMDB[0x01] == 'E' &&
  24.         (pMDB[0x0c] & 0x10) == 0x00) // !Win32 module
  25.     {
  26.         *pwVer = MAKEWORD(pMDB[0x3e], pMDB[0x3f]);
  27.         return (TRUE);
  28.     }
  29.     return (FALSE);
  30. }
  31.  
  32. BOOL SetModuleExpWinVer(HMODULE hModule, WORD wVer)
  33. {
  34.     hModule = GetExePtr(hModule);
  35.     LPBYTE pMDB = LPBYTE(MAKELP(hModule, 0));
  36.     if (!BAD_PTR(pMDB, 0x40) &&
  37.         pMDB[0x00] == 'N' && pMDB[0x01] == 'E' &&
  38.         (pMDB[0x0c] & 0x10) == 0x00) // !Win32 module
  39.     {
  40.         pMDB[0x3e] = LOBYTE(wVer); // minor
  41.         pMDB[0x3f] = HIBYTE(wVer); // major
  42.         return (TRUE);
  43.     }
  44.     return (FALSE);
  45. }
  46.  
  47. static BOOL SetQueueExpWinVer(HGLOBAL hQueue, WORD wVer)
  48. {
  49.     LPBYTE pMQ = LPBYTE(MAKELP(hQueue, 0));
  50.     if (!BAD_PTR(pMQ, 0x44))
  51.     {
  52.         if (IsWin95())
  53.         {
  54.             pMQ[0x42] = LOBYTE(wVer); // minor
  55.             pMQ[0x43] = HIBYTE(wVer); // major
  56.         }
  57.         else
  58.         {
  59.             pMQ[0x36] = LOBYTE(wVer); // minor
  60.             pMQ[0x37] = HIBYTE(wVer); // major
  61.         }
  62.         return (TRUE);
  63.     }
  64.     return (FALSE);
  65. }
  66.  
  67. BOOL GetTaskExpWinVer(HTASK hTask, LPWORD pwVer)
  68. {
  69.     LPBYTE pTDB = LPBYTE(MAKELP(hTask, 0));
  70.     if (!BAD_PTR(pTDB, 0xfc) &&
  71.         pTDB[0xfa] == 'T' && pTDB[0xfb] == 'D' &&
  72.         (pTDB[0x16] & 0x10) == 0x00) // !Win32 task
  73.     {
  74.         *pwVer = MAKEWORD(pTDB[0x1a], pTDB[0x1b]);
  75.         return (TRUE);
  76.     }
  77.     return (FALSE);
  78. }
  79.  
  80. BOOL SetTaskExpWinVer(HTASK hTask, WORD wVer)
  81. {
  82.     LPBYTE pTDB = LPBYTE(MAKELP(hTask, 0));
  83.     if (!BAD_PTR(pTDB, 0xfc) &&
  84.         pTDB[0xfa] == 'T' && pTDB[0xfb] == 'D' &&
  85.         (pTDB[0x16] & 0x10) == 0x00) // !Win32 task
  86.     {
  87.         WORD wSel = MAKEWORD(pTDB[0x20], pTDB[0x21]);
  88.         if (SetQueueExpWinVer(HGLOBAL(wSel), wVer))
  89.         {
  90.             pTDB[0x1a] = LOBYTE(wVer); // minor
  91.             pTDB[0x1b] = HIBYTE(wVer); // major
  92.             return (TRUE);
  93.         }
  94.     }
  95.     return (FALSE);
  96. }
  97.  
  98.